using JGSY.CMS.LowCode.Platform.Domain.Entities;
namespace JGSY.CMS.LowCode.Platform.Domain.Interfaces
 {
    /// <summary>
    /// 用户仓储接口
    /// 提供用户实体的数据访问操作和业务方法，包括注册、登录、查询等功能
    /// </summary>
    public interface IUserRepository
    {
        /// <summary>
        /// 添加新用户
        /// </summary>
        /// <param name="user">用户实体</param>
        /// <returns>添加操作的异步任务</returns>
        Task AddAsync(User user);
        
        /// <summary>
        /// 根据用户名获取用户
        /// </summary>
        /// <param name="username">用户名</param>
        /// <returns>用户实体，如果不存在则返回null</returns>
        Task<User?> GetByUsernameAsync(string username);
        
        /// <summary>
        /// 根据邮箱获取用户
        /// </summary>
        /// <param name="email">邮箱地址</param>
        /// <returns>用户实体，如果不存在则返回null</returns>
        Task<User?> GetByEmailAsync(string email);
        
        /// <summary>
        /// 更新用户信息
        /// </summary>
        /// <param name="user">更新后的用户实体</param>
        /// <returns>更新操作的异步任务</returns>
        Task UpdateAsync(User user);
        
        /// <summary>
        /// 检查用户名是否已存在
        /// </summary>
        /// <param name="username">用户名</param>
        /// <returns>如果存在返回true，否则返回false</returns>
        Task<bool> ExistsAsync(string username);
        
        /// <summary>
        /// 根据ID获取用户
        /// </summary>
        /// <param name="id">用户标识符</param>
        /// <returns>用户实体，如果不存在则返回null</returns>
        Task<User?> GetByIdAsync(long id);

        /// <summary>
        /// 用户注册
        /// 创建新的用户账户
        /// </summary>
        /// <param name="username">用户名</param>
        /// <param name="email">邮箱地址</param>
        /// <param name="password">密码</param>
        /// <param name="phone">手机号，可选参数</param>
        /// <returns>注册操作的异步任务</returns>
        Task RegisterAsync(string username, string email, string password, string? phone = null);
        
        /// <summary>
        /// 用户登录
        /// 验证用户凭据并返回访问令牌
        /// </summary>
        /// <param name="username">用户名</param>
        /// <param name="password">密码</param>
        /// <returns>访问令牌</returns>
        Task<string> LoginAsync(string username, string password);
        
        /// <summary>
        /// 获取当前用户信息
        /// </summary>
        /// <returns>当前用户的数据传输对象，如果不存在则返回null</returns>
        Task<Application.DTOs.UserDto?> GetCurrentUserAsync();

        /// <summary>
        /// 根据第三方平台OpenID获取用户
        /// </summary>
        /// <param name="openId">第三方平台的OpenID</param>
        /// <returns>用户实体，如果不存在则返回null</returns>
        Task<User?> GetByOpenIdAsync(string openId);
    }
}
